It’s a bit obscure but this is the crucial bit:
Defining that seems to be sufficient:
julia> Base.unsafe_convert(::Type{Ptr{T}}, A::Dummy{T}) where {T} =
Base.unsafe_convert(Ptr{T}, A.coeffs)
julia> @btime norm($x) # was 15.625 μs
min 12.416 μs, mean 12.647 μs (0 allocations)
99.28318f0
julia> @btime norm($(x.coeffs))
min 12.416 μs, mean 12.562 μs (0 allocations)
99.28318f0
julia> @which pointer(x) # no method added here
pointer(x::AbstractArray{T}) where T in Base at abstractarray.jl:1170
julia> @btime $(rand(10^4, 10^4)) * $x; # was 23.167 ms without BLAS
min 13.536 ms, mean 14.144 ms (4 allocations, 156.34 KiB)