@@ -92,6 +92,7 @@ static const struct pci_epf_mhi_ep_info sdx55_info = {
92
92
};
93
93
94
94
struct pci_epf_mhi {
95
+ const struct pci_epc_features * epc_features ;
95
96
const struct pci_epf_mhi_ep_info * info ;
96
97
struct mhi_ep_cntrl mhi_cntrl ;
97
98
struct pci_epf * epf ;
@@ -102,6 +103,11 @@ struct pci_epf_mhi {
102
103
int irq ;
103
104
};
104
105
106
+ static size_t get_align_offset (struct pci_epf_mhi * epf_mhi , u64 addr )
107
+ {
108
+ return addr & (epf_mhi -> epc_features -> align - 1 );
109
+ }
110
+
105
111
static int __pci_epf_mhi_alloc_map (struct mhi_ep_cntrl * mhi_cntrl , u64 pci_addr ,
106
112
phys_addr_t * paddr , void __iomem * * vaddr ,
107
113
size_t offset , size_t size )
@@ -133,8 +139,7 @@ static int pci_epf_mhi_alloc_map(struct mhi_ep_cntrl *mhi_cntrl, u64 pci_addr,
133
139
size_t size )
134
140
{
135
141
struct pci_epf_mhi * epf_mhi = to_epf_mhi (mhi_cntrl );
136
- struct pci_epc * epc = epf_mhi -> epf -> epc ;
137
- size_t offset = pci_addr & (epc -> mem -> window .page_size - 1 );
142
+ size_t offset = get_align_offset (epf_mhi , pci_addr );
138
143
139
144
return __pci_epf_mhi_alloc_map (mhi_cntrl , pci_addr , paddr , vaddr ,
140
145
offset , size );
@@ -159,9 +164,7 @@ static void pci_epf_mhi_unmap_free(struct mhi_ep_cntrl *mhi_cntrl, u64 pci_addr,
159
164
size_t size )
160
165
{
161
166
struct pci_epf_mhi * epf_mhi = to_epf_mhi (mhi_cntrl );
162
- struct pci_epf * epf = epf_mhi -> epf ;
163
- struct pci_epc * epc = epf -> epc ;
164
- size_t offset = pci_addr & (epc -> mem -> window .page_size - 1 );
167
+ size_t offset = get_align_offset (epf_mhi , pci_addr );
165
168
166
169
__pci_epf_mhi_unmap_free (mhi_cntrl , pci_addr , paddr , vaddr , offset ,
167
170
size );
@@ -185,7 +188,7 @@ static int pci_epf_mhi_read_from_host(struct mhi_ep_cntrl *mhi_cntrl, u64 from,
185
188
void * to , size_t size )
186
189
{
187
190
struct pci_epf_mhi * epf_mhi = to_epf_mhi (mhi_cntrl );
188
- size_t offset = from % SZ_4K ;
191
+ size_t offset = get_align_offset ( epf_mhi , from ) ;
189
192
void __iomem * tre_buf ;
190
193
phys_addr_t tre_phys ;
191
194
int ret ;
@@ -213,7 +216,7 @@ static int pci_epf_mhi_write_to_host(struct mhi_ep_cntrl *mhi_cntrl,
213
216
void * from , u64 to , size_t size )
214
217
{
215
218
struct pci_epf_mhi * epf_mhi = to_epf_mhi (mhi_cntrl );
216
- size_t offset = to % SZ_4K ;
219
+ size_t offset = get_align_offset ( epf_mhi , to ) ;
217
220
void __iomem * tre_buf ;
218
221
phys_addr_t tre_phys ;
219
222
int ret ;
@@ -270,6 +273,10 @@ static int pci_epf_mhi_core_init(struct pci_epf *epf)
270
273
return ret ;
271
274
}
272
275
276
+ epf_mhi -> epc_features = pci_epc_get_features (epc , epf -> func_no , epf -> vfunc_no );
277
+ if (!epf_mhi -> epc_features )
278
+ return - ENODATA ;
279
+
273
280
return 0 ;
274
281
}
275
282
0 commit comments