Skip to content

Commit b9c1178

Browse files
Simon Xuerkhuangtao
authored andcommitted
drm/rockchip: gem: dynamic get ddr map info for reorder page
Change-Id: Ib543717f06c0218a7556a84b973d306afe93aefa Signed-off-by: Simon Xue <xxm@rock-chips.com>
1 parent 9bd46a1 commit b9c1178

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

drivers/gpu/drm/rockchip/rockchip_drm_drv.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1874,6 +1874,8 @@ static int __init rockchip_drm_init(void)
18741874
if (ret)
18751875
goto err_unreg_drivers;
18761876

1877+
rockchip_gem_get_ddr_info();
1878+
18771879
return 0;
18781880

18791881
err_unreg_drivers:

drivers/gpu/drm/rockchip/rockchip_drm_gem.c

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,14 @@
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+
2428
struct 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+
103118
static 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

drivers/gpu/drm/rockchip/rockchip_drm_gem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,5 @@ int rockchip_gem_prime_end_cpu_access_partial(struct drm_gem_object *obj,
9090
enum dma_data_direction dir,
9191
unsigned int offset,
9292
unsigned int len);
93-
93+
void rockchip_gem_get_ddr_info(void);
9494
#endif /* _ROCKCHIP_DRM_GEM_H */

0 commit comments

Comments
 (0)