49
49
#define RD_LOCAL_MEMRESERVE_DONE BIT(2)
50
50
51
51
static u32 lpi_id_bits ;
52
+ static bool dma_32bit_flag ;
52
53
53
54
/*
54
55
* We allocate memory for PROPBASE to cover 2 ^ lpi_id_bits LPIs to
@@ -2309,6 +2310,7 @@ static int its_setup_baser(struct its_node *its, struct its_baser *baser,
2309
2310
u32 alloc_pages , psz ;
2310
2311
struct page * page ;
2311
2312
void * base ;
2313
+ gfp_t flags = GFP_KERNEL | __GFP_ZERO ;
2312
2314
2313
2315
psz = baser -> psz ;
2314
2316
alloc_pages = (PAGE_ORDER_TO_SIZE (order ) / psz );
@@ -2320,7 +2322,10 @@ static int its_setup_baser(struct its_node *its, struct its_baser *baser,
2320
2322
order = get_order (GITS_BASER_PAGES_MAX * psz );
2321
2323
}
2322
2324
2323
- page = alloc_pages_node (its -> numa_node , GFP_KERNEL | __GFP_ZERO , order );
2325
+ if (dma_32bit_flag )
2326
+ flags |= GFP_DMA32 ;
2327
+
2328
+ page = alloc_pages_node (its -> numa_node , flags , order );
2324
2329
if (!page )
2325
2330
return - ENOMEM ;
2326
2331
@@ -3293,6 +3298,7 @@ static bool its_alloc_table_entry(struct its_node *its,
3293
3298
struct page * page ;
3294
3299
u32 esz , idx ;
3295
3300
__le64 * table ;
3301
+ gfp_t flags = GFP_KERNEL | __GFP_ZERO ;
3296
3302
3297
3303
/* Don't allow device id that exceeds single, flat table limit */
3298
3304
esz = GITS_BASER_ENTRY_SIZE (baser -> val );
@@ -3306,9 +3312,12 @@ static bool its_alloc_table_entry(struct its_node *its,
3306
3312
3307
3313
table = baser -> base ;
3308
3314
3315
+ if (dma_32bit_flag )
3316
+ flags |= GFP_DMA32 ;
3317
+
3309
3318
/* Allocate memory for 2nd level table */
3310
3319
if (!table [idx ]) {
3311
- page = alloc_pages_node (its -> numa_node , GFP_KERNEL | __GFP_ZERO ,
3320
+ page = alloc_pages_node (its -> numa_node , flags ,
3312
3321
get_order (baser -> psz ));
3313
3322
if (!page )
3314
3323
return false;
@@ -5069,8 +5078,11 @@ static int __init its_probe_one(struct its_node *its)
5069
5078
struct page * page ;
5070
5079
u32 ctlr ;
5071
5080
int err ;
5081
+ gfp_t flags = GFP_KERNEL | __GFP_ZERO ;
5072
5082
5073
5083
its_enable_quirks (its );
5084
+ if (dma_32bit_flag )
5085
+ flags |= GFP_DMA32 ;
5074
5086
5075
5087
if (is_v4 (its )) {
5076
5088
if (!(its -> typer & GITS_TYPER_VMOVP )) {
@@ -5102,7 +5114,7 @@ static int __init its_probe_one(struct its_node *its)
5102
5114
}
5103
5115
}
5104
5116
5105
- page = alloc_pages_node (its -> numa_node , GFP_KERNEL | __GFP_ZERO ,
5117
+ page = alloc_pages_node (its -> numa_node , flags ,
5106
5118
get_order (ITS_CMD_QUEUE_SZ ));
5107
5119
if (!page ) {
5108
5120
err = - ENOMEM ;
@@ -5418,6 +5430,8 @@ static int __init its_of_probe(struct device_node *node)
5418
5430
continue ;
5419
5431
}
5420
5432
5433
+ if (of_property_read_bool (np , "dma-32bit-quirk" ))
5434
+ dma_32bit_flag = true;
5421
5435
5422
5436
its = its_node_init (& res , & np -> fwnode , of_node_to_nid (np ));
5423
5437
if (!its )
@@ -5648,6 +5662,7 @@ int __init its_init(struct fwnode_handle *handle, struct rdists *rdists,
5648
5662
bool has_v4 = false;
5649
5663
bool has_v4_1 = false;
5650
5664
int err ;
5665
+ dma_32bit_flag = false;
5651
5666
5652
5667
gic_rdists = rdists ;
5653
5668
0 commit comments