1717#include <linux/iommu.h>
1818#include <linux/pagemap.h>
1919#include <linux/vmalloc.h>
20+ #include <linux/rockchip/rockchip_sip.h>
2021
2122#include "rockchip_drm_drv.h"
2223#include "rockchip_drm_gem.h"
2324
25+ static u32 bank_bit_first = 12 ;
26+ static u32 bank_bit_mask = 0x7 ;
27+
2428struct page_info {
2529 struct page * page ;
2630 struct list_head list ;
@@ -100,6 +104,17 @@ static void rockchip_gem_free_list(struct list_head lists[])
100104 }
101105}
102106
107+ void rockchip_gem_get_ddr_info (void )
108+ {
109+ struct dram_addrmap_info * ddr_map_info ;
110+
111+ ddr_map_info = sip_smc_get_dram_map ();
112+ if (ddr_map_info ) {
113+ bank_bit_first = ddr_map_info -> bank_bit_first ;
114+ bank_bit_mask = ddr_map_info -> bank_bit_mask ;
115+ }
116+ }
117+
103118static int rockchip_gem_get_pages (struct rockchip_gem_object * rk_obj )
104119{
105120 struct drm_device * drm = rk_obj -> base .dev ;
@@ -114,7 +129,7 @@ static int rockchip_gem_get_pages(struct rockchip_gem_object *rk_obj)
114129 struct list_head lists [PG_ROUND ];
115130 dma_addr_t phys ;
116131 int end = 0 ;
117- unsigned int bit12_14 ;
132+ unsigned int bit_index ;
118133 unsigned int block_index [PG_ROUND ] = {0 };
119134 struct page_info * info ;
120135 unsigned int maximum ;
@@ -139,6 +154,9 @@ static int rockchip_gem_get_pages(struct rockchip_gem_object *rk_obj)
139154 goto err_put_pages ;
140155 }
141156
157+ DRM_DEBUG_KMS ("bank_bit_first = 0x%x, bank_bit_mask = 0x%x\n" ,
158+ bank_bit_first , bank_bit_mask );
159+
142160 cur_page = 0 ;
143161 remain = n_pages ;
144162 /* look for the end of the current chunk */
@@ -150,7 +168,7 @@ static int rockchip_gem_get_pages(struct rockchip_gem_object *rk_obj)
150168 }
151169
152170 chunk_pages = j - cur_page ;
153- if (chunk_pages > 7 ) {
171+ if (chunk_pages >= PG_ROUND ) {
154172 for (i = 0 ; i < chunk_pages ; i ++ )
155173 dst_pages [end + i ] = pages [cur_page + i ];
156174 end += chunk_pages ;
@@ -165,9 +183,9 @@ static int rockchip_gem_get_pages(struct rockchip_gem_object *rk_obj)
165183 INIT_LIST_HEAD (& info -> list );
166184 info -> page = pages [cur_page + i ];
167185 phys = page_to_phys (info -> page );
168- bit12_14 = (phys >> 12 ) & 0x7 ;
169- list_add_tail (& info -> list , & lists [bit12_14 ]);
170- block_index [bit12_14 ]++ ;
186+ bit_index = (( phys >> bank_bit_first ) & bank_bit_mask ) % PG_ROUND ;
187+ list_add_tail (& info -> list , & lists [bit_index ]);
188+ block_index [bit_index ]++ ;
171189 }
172190 }
173191
0 commit comments